// 正则主要是运用在字符串上的一种方法
// 它有两种声明方式，一种是语法糖格式，另一种是直接使用构造函数

// 直接使用语法糖
let reg1 = /xyz/;

// 使用构造函数
let reg2 = new RegExp("abc");

// test 方法 检查某个字符串中有没有给定的字符
let str = "asdxyz";
// console.log(reg1.test(str));
// console.log(reg2.test(str));

// g 全局匹配的修饰符
// 所有的正则对象都有一个lastIndex的属性，他表示的是下一次匹配的位置
// 如果在正则表达式后面添加了全局匹配的修饰符属性，可以一直沿着上一次的
// 匹配结果进行下一次的继续匹配，他之间会有连续性
// 这个修饰符在进行对象的字符串转换的时候也特别的有用

var r = /x/g;
var s = "_x_x";

r.lastIndex; // 0
r.test(s); // true

r.lastIndex; // 2
r.test(s); // true

r.lastIndex; // 4
r.test(s); // false

// i 修饰符i的作用是忽略大小写
let str2 = "asdXyz";
let reg3 = /xyz/i;
// console.log(reg1.test(str2));
// console.log(reg3.test(str2));

// exec 方法 用来返回匹配结果，如果发现有值，就会返回一个数组，内部除了这元素
// 还会返回其他的属性  input：整个原字符串
// 还有一个 dex：模式匹配成功的开始位置（从0开始计数）
// 数组的元素是匹配成功的字符串,否则会返回null
let s2 = "abcdefghjkbjshafihewauihlsdfahlkdjoweurqoieru";
let r1 = /a/;
let r2 = /b/;
let r3 = /d/g;
// console.log(r1.exec(s2));
// console.log(r2.exec(s2));
// 如果使用功能了g进行全局匹配，他会从上一次的结果继续进行下一次的匹配
// console.log(r3.exec(s2));
// console.log(r3.exec(s2));
// console.log(r3.exec(s2));
// console.log(r3.exec(s2)); // 直到最后一次没有符合要求的值了，返回null

// 利用g修饰符允许多次匹配的特点，可以用一个循环完成全部匹配
var reg4 = /a/g;
var str3 = 'abc_abc_abc'

while (true) {
  var match = reg4.exec(str3);
  if (!match) break;
  console.log('#' + match.index + ':' + match[0]);
}
// #0:a
// #4:a
// #8:a
